# Update group branding

Updates the visual branding elements of a group including color theme, banner image, and avatar. Color must be in HEX format. Banner and avatar are references to previously uploaded media. Setting banner or avatar to null removes them. Requires the GroupSettings.Manage RBAC permission (group admin).

RBAC: requires GroupSettings.Manage

Endpoint: PUT /api/v1/groups/{groupId}/branding
Version: 1.0
Security: header

## Path parameters:

  - `groupId` (string, required)
    The unique identifier of the group
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

## Request fields (application/json):

  - `color` (string,null)
    Theme color for the group in 6-character HEX format with # prefix. Used for UI theming. Null to keep existing color.
    Example: "#FF5733"

  - `bannerId` (string,null)
    Upload ID of the banner image. Must be a previously uploaded image. Null to keep existing banner.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `avatarId` (string,null)
    Upload ID of the avatar image. Must be a previously uploaded image. Null to keep existing avatar.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

## Response 200 fields (application/json):

  - `stats` (object)
    Group statistics

  - `stats.posts` (integer, required)
    Total number of posts

  - `stats.postsLast24h` (integer, required)
    Posts created in the last 24 hours

  - `stats.comments` (integer, required)
    Total number of comments

  - `stats.totalStorageBytes` (integer, required)
    Total uploaded bytes

  - `stats.avgPostsPerDay` (number, required)
    Average posts per day over the last 30 days

  - `stats.avgBytesPerDay` (number, required)
    Average uploaded bytes per day over the last 30 days

  - `stats.members` (integer, required)
    Count of active members in the group

  - `stats.totalEvents` (integer, required)
    Total group events recorded

  - `meta` (object, required)
    group metadata including color

  - `meta.color` (string, required)
    Group color in HEX format

  - `privacy` (string, required)
    who can access the group's content
    Enum: "PUBLIC", "PRIVATE"

  - `visibility` (string, required)
    how discoverable the group is
    Enum: "VISIBLE", "UNLISTED", "HIDDEN"

  - `joinMode` (string, required)
    how users can join the group
    Enum: "OPEN", "APPROVAL", "INVITE_ONLY"

  - `location` (object,null)
    group's location

  - `location.geo` (object,null, required)
    Coordinates and other geo data

  - `location.geo.latitude` (number, required)

  - `location.geo.longitude` (number, required)

  - `location.geo.altitude` (number,null)

  - `location.geo.accuracy` (number,null)

  - `location.geo.verticalAccuracy` (number,null)

  - `location.geo.speed` (number,null)

  - `location.geo.bearing` (number,null)

  - `location.geo.timestamp` (integer,null)

  - `location.name` (string,null, required)

  - `location.autoUpdate` (boolean, required)

  - `location.show` (boolean, required)

  - `timezone` (object,null)
    group's timezone

  - `timezone.ianaTimezone` (string,null, required)

  - `timezone.autoUpdate` (boolean, required)

  - `timezone.show` (boolean, required)

  - `isMember` (boolean,null)
    Whether the current viewer is a member of the group

  - `pin` (integer,null)
    Pin order number if group is pinned by viewer (null if not pinned)

  - `canManage` (boolean,null)
    Whether the current viewer can manage this group (owner, admin, or moderator)

  - `isOwner` (boolean,null)
    Whether the current viewer is an owner or admin of this group

  - `roles` (array,null)
    Viewer's roles in this group. Only populated in admin endpoints.

  - `groupId` (string, required)
    internal id of this group
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `groupName` (string, required)
    unique group name

  - `domain` (string, required)
    Group's domain

  - `local` (boolean, required)
    Whether this group is local to this server

  - `displayName` (string, required)
    full name of the group

  - `summary` (string, required)
    Group description

  - `uri` (string, required)
    URI of this group

  - `publicKey` (string, required)
    Group's public key for ActivityPub

  - `fields` (object)
    Custom fields for the group

  - `type` (string, required)
    the type of this group
    Enum: "CHANNEL", "INTEREST_GROUP", "ORGANIZATION"

  - `membersUrl` (string, required)
    URL to group members

  - `banner` (object,null)
    Group's header/banner upload

  - `banner.uploadId` (string, required)
    Internal id
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `banner.uploaderId` (string,null)
    User who physically uploaded this file. Null for platform-owned uploads (e.g., default covers). This is an audit/meta field — use ownerId for authorization.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `banner.ownerId` (string, required)
    Entity that owns this upload (user, channel/group, or event). TypeID prefix indicates the owner type.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `banner.attachedToId` (string,null)
    Entity this upload is attached to (e.g., a post or event). NULL for standalone uploads like avatars, covers, or media library items.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `banner.uploadType` (string, required)
    Type of the upload
    Enum: "VIDEO", "IMAGE", "AUDIO", "DOCUMENT", "OTHER"

  - `banner.meta` (object)
    Meta data

  - `banner.meta.blurhash` (string,null)

  - `banner.meta.name` (string,null)

  - `banner.meta.altText` (string,null)

  - `banner.size` (integer, required)
    Size in bytes of all the files in this upload

  - `banner.files` (array, required)
    List of all the files this upload has

  - `banner.files.uri` (string,null, required)
    Full url of the file

  - `banner.files.fileId` (string, required)
    File id
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `banner.files.extension` (string, required)
    File extension
    Example: "mp4"

  - `banner.files.original` (boolean, required)
    true if this file is original, false if it is a derivative

  - `banner.files.meta` (object, required)
    File metadata. Contains optional values for width, height etc.

  - `banner.files.meta.duration` (number,null)
    Video duration in seconds

  - `banner.files.meta.width` (integer,null)
    Media width

  - `banner.files.meta.height` (integer,null)
    Media height

  - `banner.files.meta.codec` (string,null)
    Video codec

  - `banner.files.meta.rotate` (integer,null)
    Rotation in degrees

  - `banner.files.size` (integer, required)
    File size in bytes

  - `banner.files.createdAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `banner.files.updatedAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `banner.files.type` (string, required)
    File type
    Enum: "VIDEO", "IMAGE", "AUDIO", "DOCUMENT", "OTHER"

  - `banner.tags` (array, required)
    List of tags attached to upload
    Enum: "Post", "Avatar", "Header", "Album", "Emoji", "Event"

  - `banner.error` (string,null)
    Upload processing error

  - `banner.cached` (boolean)
    true if cached

  - `banner.logs` (string,null)
    Logs

  - `banner.remote` (boolean)
    true if this upload is remote

  - `banner.createdAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `banner.updatedAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `avatar` (object,null)
    Group's avatar

  - `avatar.uploadId` (string, required)
    Internal id
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `avatar.uploaderId` (string,null)
    User who physically uploaded this file. Null for platform-owned uploads (e.g., default covers). This is an audit/meta field — use ownerId for authorization.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `avatar.ownerId` (string, required)
    Entity that owns this upload (user, channel/group, or event). TypeID prefix indicates the owner type.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `avatar.attachedToId` (string,null)
    Entity this upload is attached to (e.g., a post or event). NULL for standalone uploads like avatars, covers, or media library items.
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `avatar.uploadType` (string, required)
    Type of the upload
    Enum: "VIDEO", "IMAGE", "AUDIO", "DOCUMENT", "OTHER"

  - `avatar.meta` (object)
    Meta data

  - `avatar.meta.blurhash` (string,null)

  - `avatar.meta.name` (string,null)

  - `avatar.meta.altText` (string,null)

  - `avatar.size` (integer, required)
    Size in bytes of all the files in this upload

  - `avatar.files` (array, required)
    List of all the files this upload has

  - `avatar.files.uri` (string,null, required)
    Full url of the file

  - `avatar.files.fileId` (string, required)
    File id
    Example: "us_01hxcvk1hjexere4pvtrj0ymqq"

  - `avatar.files.extension` (string, required)
    File extension
    Example: "mp4"

  - `avatar.files.original` (boolean, required)
    true if this file is original, false if it is a derivative

  - `avatar.files.meta` (object, required)
    File metadata. Contains optional values for width, height etc.

  - `avatar.files.meta.duration` (number,null)
    Video duration in seconds

  - `avatar.files.meta.width` (integer,null)
    Media width

  - `avatar.files.meta.height` (integer,null)
    Media height

  - `avatar.files.meta.codec` (string,null)
    Video codec

  - `avatar.files.meta.rotate` (integer,null)
    Rotation in degrees

  - `avatar.files.size` (integer, required)
    File size in bytes

  - `avatar.files.createdAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `avatar.files.updatedAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `avatar.files.type` (string, required)
    File type
    Enum: "VIDEO", "IMAGE", "AUDIO", "DOCUMENT", "OTHER"

  - `avatar.tags` (array, required)
    List of tags attached to upload
    Enum: "Post", "Avatar", "Header", "Album", "Emoji", "Event"

  - `avatar.error` (string,null)
    Upload processing error

  - `avatar.cached` (boolean)
    true if cached

  - `avatar.logs` (string,null)
    Logs

  - `avatar.remote` (boolean)
    true if this upload is remote

  - `avatar.createdAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `avatar.updatedAt` (string, required)
    Example: "2022-03-10T16:15:50Z"

  - `deletedAt` (string,null)
    Group deletion timestamp
    Example: "2022-03-10T16:15:50Z"

  - `createdAt` (string)
    Group's creation timestamp
    Example: "2022-03-10T16:15:50Z"

  - `updatedAt` (string)
    Group's last update timestamp
    Example: "2022-03-10T16:15:50Z"

  - `refreshedAt` (string)
    Group's last refresh timestamp
    Example: "2022-03-10T16:15:50Z"

  - `secret` (boolean)

## Response 400 fields (application/json):

  - `errorCode` (string, required)
    Error code

  - `message` (string, required)
    Error message

  - `docUrl` (string)
    Link to documentation

## Response 401 fields (application/json):

  - `errorCode` (string, required)
    Error code

  - `message` (string, required)
    Error message

  - `docUrl` (string)
    Link to documentation

## Response 403 fields (application/json):

  - `errorCode` (string, required)
    Error code

  - `message` (string, required)
    Error message

  - `docUrl` (string)
    Link to documentation

## Response 404 fields (application/json):

  - `errorCode` (string, required)
    Error code

  - `message` (string, required)
    Error message

  - `docUrl` (string)
    Link to documentation


